#pragma once

#define MOUSE_LEFT 1
#define MOUSE_RIGHT 2
#define MOUSE_MIDDLE 3
#define MOUSE_NONE 0

#define MSG(text) MessageBox(NULL, text, L"NOTIFICATION", MB_OK)
#define STUFF_BUTTON(classname) classname(int left, int top, int width, int height) :Button(left, top, width, height) {} \
								~classname() {}

#define STUFF_TEXT(classname) classname(int left, int top, int width, int height) :TextBox(left, top, width, height) {} \
							   ~classname() {}

#define DRAW void draw(Gdiplus::Graphics & graphics) override
#define LBUTTONUP(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2)
#define LBUTTONDOWN(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2)
#define KEYDOWN(classname, func) std::bind(&classname::func, this, std::placeholders::_1)
#define KEYUP(classname, func) std::bind(&classname::func, this, std::placeholders::_1)
#define RBUTTONDOWN(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2)
#define RBUTTONUP(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2)
#define MOUSEMOVE(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
#define MOUSELEAVE(classname, func) std::bind(&classname::func, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)
#define GETFOCUS(classname, func) std::bind(&classname::func, this)
#define LOSTFOCUS(classname, func) std::bind(&classname::func, this)